PHP MVC Dispatching
Routing leert ons de weg waar we naar toe willen. Dispatching slaat de opgegeven weg in.
Stappenplan
- Voorkennis: PHP Routing
De methode
getRouteDatabreekt de uri op in de naam van de controllerklasse, de actiemethode en een eventuele parameter. Vertalingen voor routing zijn: routeren ; routetoewijzing ; routering ; routing ; route-bepaling ; route ; reisweg ; vervoerweg ; routebepaling ; routekeuze. En dat is precies wat we in PHP routing hebben gedaan. Meer dus dan een URI splitsen. Deze methode retourneert een associatieve array:return array( 'controllerClassName' => $controllerClassName, 'actionMethodName' => $actionMethodName, 'parameterValue' => $parameterValue); - De eenvoudigste manier om te dispatchen is met een
switch. In de index.php van de root schrijf je:<?php
// var_dump($_SERVER); use ThreepennyMVC\FrontController; include_once('../vendor/threepennymvc/FrontController.php'); include_once('./Controllers/AdminController.php'); // default namespace is root \ // otherwise specify it as argument $route = FrontController::getRouteData($_SERVER['REQUEST_URI'], 'Fricfrac', 'Admin', 'index'); // var_dump($route); switch ($route["controllerClassName"]) { case 'Fricfrac\Controllers\AdminController' : switch ($route["actionMethodName"]) { case 'index' : $controller = new \Fricfrac\Controllers\AdminController(); $view = $controller->index(); break; } } - Dat is geen probleem zolang er niet teveel cases in de
switchstaan. Maar voor een applicatie als Fric-frac wordt dat al gauw een lange rij. We kunnen dit vereenvoudigen door een dispatchter te schrijven die met behulp van relfection de actiemethode van de controller-klasse uitvoert.- Voor de gevorderden:
Philip Brown, What is Reflection in PHP?, 2 Jul 2014
PHP manual: The ReflectionClass class - De
dispatchmethode heeft$actionparameter waarin de routing, die doorgetRoutingwerd geretourneerd, wordt doorgegeven. DeReflectionClassvan PHP gebruikt die routingdata om een instantie van de opgeven Controllerklasse te maken en de opgegeven methode uit te voeren:public static function dispatch($action) { try { $reflection = new \ReflectionClass($action['controllerClassName']); try { $actionMethod = new \ReflectionMethod($action['controllerClassName'], $action['actionMethodName']); $controller = $reflection->newInstance(); return $actionMethod->invokeArgs($controller, array($action['parameterValue'])); } catch (\ReflectionException $e) { $actionMethodName = $action['actionMethodName']; echo "Method $actionMethodName does not exist!"; return false; } } catch (\ReflectionException $e) { $controllerClassName = $action['controllerClassName']; echo "Class $controllerClassName does not exist!"; return false; } } - Plaats de
dispatchmethode in deFrontControllerklasse.
- Voor de gevorderden:
2020-04-09 07:29:34